package com.blackhorse.domain;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * Spirng ioc的注解配置实体类
 *
 * IOC注解类型：
 * 1)用于创建对象的：相当于xml配置中的<bean>标签
 * @Component 创建bean对象存入spring容器
 * 属性：
 * value ： 用于指定bean的id，如果不指定，默认值为当前类名（首字母小写）
 *
 * @Controller 用于表现层
 * @Service 用于业务层
 * @Repository 用于持久层
 * 以上三个注解与Component注解功能完全相同，另外它们具有三层架构的语义作用，使分层逻辑更加明确
 *
 * 2）用于注入数据的，相当于xml配置中的<property>标签，不需要有set方法
 * @Autowired：
 * 自动按照类型注入，可以修饰变量和方法。
 * 作用：如果容器中有唯一的一个bean对象类型与注入的变量类型匹配，则自动注入。
 * 注意：1 如果没有匹配类型的bean对象则注入失败。
 * 2 如果容器中存在多个匹配类型的bean对象，则查找其中与被注入变量名相同的id对应的bean对象，如果有注入成功，否则注入失败。
 * @Qualifier：
 * 作用：在按照类中注入的基础上按照名称注入，在给类成员注入时不能单独使用（需要和Autowired配合），
 * 在给方法参数注入时可以单独使用
 *属性：value 用于指定注入bean的id
 * @Resource：
 * 作用:直接按照bean的id注入，可以独立使用
 * 属性： name 指定注入bean的id
 *
 * 注意1：以上三个注解只能注入bean类型，不能注入基本类型和集合类型。
 * 注意2：集合类型只能用xml配置方式注入
 *
 * @Value：
 * 作用：用于注入基本类型和String类型
 * 属性：value 注入属性的值，可以使用SpEl（Spring的El表达式）
 * SpEl语法： ${表达式} 在Spring容器中获取数据
 *
 * 3)用于改变bean作用范围的
 * 相当于xml配置中的<bean>标签中的scope属性
 * @Scope：
 * 作用：指定bean的作用范围
 * 属性： value 作用范围 常用取值： singleton(单例，默认) prototype（多例）
 *
 * 4）和生命周期相关的 (了解)
 *  相当于xml配置中的<bean>标签中的init-method和destroy-method属性
 * @PostConstruct 指定初始化方法
 * @PreDestroy 指定销毁方法
 */
@Component("accountAnno")
@Scope("singleton")
public class AccountAnno {

    @Value("4")
    private int id;
    @Value("王五")
    private String name;
    @Value("1340.5")
    private float money;

    @PostConstruct//配置初始化方法
    public void init() {
        System.out.println(this.getClass().getName() + "被创建...");
    }

    @PreDestroy//配置销毁方法
    public void destory(){
        System.out.println(this.getClass().getName() + "被销毁...");
    }
    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}
